//////////////////////////////////////////////////////////////////////
//
// NO_Test.h: interface for the NO_Test class.
//
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
#ifndef __NO_Test__
#define __NO_Test__

//////////////////////////////////////////////////////////////////////////
#include "NO_Externs.h"
#include "NO_CModule.h"
#include <math.h>
extern NO_UInt32 sc;

//////////////////////////////////////////////////////////////////////////
class Base
{
public:
	//////////////////////////////////////////////////////////////////////////
	Base(void);
	virtual ~Base(void);

	//////////////////////////////////////////////////////////////////////////
	NO_Int32 sl;
};

//////////////////////////////////////////////////////////////////////////
class VirBaseL : virtual public Base
{
public:
	//////////////////////////////////////////////////////////////////////////
	VirBaseL(void);
	virtual ~VirBaseL(void);

	//////////////////////////////////////////////////////////////////////////
	NO_Int32 slb;
};

//////////////////////////////////////////////////////////////////////////
class VirBaseR : virtual public Base
{
public:
	//////////////////////////////////////////////////////////////////////////
	VirBaseR(void);
	virtual ~VirBaseR(void);

	//////////////////////////////////////////////////////////////////////////
	NO_Int32 slc;
};

//////////////////////////////////////////////////////////////////////////
class Super  : public VirBaseL, public VirBaseR
{
public:
	//////////////////////////////////////////////////////////////////////
	Super(void);
	virtual ~Super(void);

	//////////////////////////////////////////////////////////////////////
	NO_Int32 slmt;
};

//////////////////////////////////////////////////////////////////////////
class SmallMaster
{
public:
	//////////////////////////////////////////////////////////////////////////
	SmallMaster(void);
	virtual~SmallMaster(void);

	//////////////////////////////////////////////////////////////////////////
	void setBaseB(void);
	void setBaseL(void);
	void setBaseR(void);
	void setBaseM(void);

protected:
	//////////////////////////////////////////////////////////////////////////
	Base* base;
};

//////////////////////////////////////////////////////////////////////////
class FullMaster
{
public:
	//////////////////////////////////////////////////////////////////////////
	// con/destruction
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	FullMaster(void);
	virtual~FullMaster(void);

	//////////////////////////////////////////////////////////////////////////
	// modify
	//////////////////////////////////////////////////////////////////////////
	
	//////////////////////////////////////////////////////////////////////////
	void setBaseB(void);
	void setBaseL(void);
	void setBaseR(void);
	void setBaseM(void);

	//////////////////////////////////////////////////////////////////////////
	void setIntArray(void);
	void setValue(void);
	void madePtrPtr(void);
	void delPtrPtr(void);

	//////////////////////////////////////////////////////////////////////////
	void vecPtrMan(void);
	void vecBaseMan(void);
	void mapPtrMan(void);
	void mapBaseMan(void);

	//////////////////////////////////////////////////////////////////////////
	void setDynamicBase(void);
	void setDynamicSuper(void);

	//////////////////////////////////////////////////////////////////////////
	void setNoPointer(void);

	//////////////////////////////////////////////////////////////////////////
	void setSTL(void);

	//////////////////////////////////////////////////////////////////////////
	// modify
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	void setValueTo(NO_UInt32);

	//////////////////////////////////////////////////////////////////////////
	// test functions
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	NO_UInt32	t(void)				;
	NO_UInt32	tc(void)	const	;
	NO_UInt32&	tr(void)			;
	NO_UInt32&	trc(void)	const	;

	//////////////////////////////////////////////////////////////////////////
	NO_UInt32	t1(NO_UInt32)			;
	NO_UInt32	t1c(NO_UInt32)	const	;
	NO_UInt32&	t1r(NO_UInt32)			;
	NO_UInt32&	t1rc(NO_UInt32)	const	;

	//////////////////////////////////////////////////////////////////////////
	NO_UInt32	t2(NO_UInt32,NO_UInt32)				;
	NO_UInt32	t2c(NO_UInt32,NO_UInt32)	const	;
	NO_UInt32&	t2r(NO_UInt32,NO_UInt32)			;
	NO_UInt32&	t2rc(NO_UInt32,NO_UInt32)	const	;

protected:
	//////////////////////////////////////////////////////////////////////////
	typedef void(FullMaster::*VoidFunc)(void);

	//////////////////////////////////////////////////////////////////////////
	VoidFunc func;
	NO_TypeObject<Super> noObject;
	NO_Object noObjectToSame;
	NO_UInt32 value;
	NO_UInt32* ptrToInt;
	const int cInt;
	const int* cIntPtr;
	Base* ptr;
	Base* ptrToSame;
	Base* allArray[2];
	Base* ptrIntoArray;
	Base* dynamicArray;
	Base objArray[2];
	NO_UInt32 intArray[2];
	std::vector<Base*> vecOfPtr;
	std::vector<Base> vecOfBase;
	std::map<NO_UInt32,Base*> mapOfPtr;
	std::map<NO_UInt32,Base> mapOfBase;
	static NO_UInt32 sInt;
	static NO_UInt32 sIntArr[2];
};

#endif

